package cn.iocoder.yudao.module.ad.plan.service;

import cn.iocoder.yudao.framework.business.basic.service.CrudService;
import cn.iocoder.yudao.framework.business.order.pojo.vo.OrderSubmitVO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.ad.plan.dal.dataobject.AdPlanDO;
import cn.iocoder.yudao.module.ad.plan.vo.AdPlanQueryDTO;
import cn.iocoder.yudao.module.ad.plan.vo.AdPlanSaveDTO;
import cn.iocoder.yudao.module.ad.plan.vo.AppAdPlanVO;
import cn.iocoder.yudao.module.api.ad.plan.dto.AdPlanRespDTO;

import java.util.Set;

/**
 * 广告投放计划 Service 接口
 *
 * @author 山野羡民（1032694760@qq.com）
 */
public interface AppAdPlanService extends CrudService<AdPlanDO, AppAdPlanVO, AdPlanSaveDTO, AdPlanQueryDTO> {

    /**
     * 提交广告投放计划
     *
     * @param param 参数
     * @param userId 用户编号
     * @param userIp 用户 IP
     * @param userUa 用户 UA
     * @return 提交结果
     */
    OrderSubmitVO submit(AdPlanSaveDTO param, Long userId);

    /**
     * 更新广告投放计划为已支付状态
     *
     * @param tradeNo 支付流水号
     * @param userId 用户编号
     * @param planId 广告投放计划编号
     */
    void updateWhenPaid(String tradeNo, Long userId, Long planId);

    /**
     * 获取一个可用的广告投放计划
     *
     * @return 广告投放计划
     */
    AdPlanRespDTO takeAvailable(Set<Long> excludePlanIds);

    /**
     * 获取一个可用的广告投放计划
     *
     * @param excludeUserId 排除的用户编号
     * @param excludePlanIds 排除的广告投放计划编号集合
     * @return 广告投放计划
     */
    AdPlanRespDTO takeAvailable(Long excludeUserId, Set<Long> excludePlanIds);

    /**
     * 更新广告投放计划播放完成时的花费价格
     *
     * @param planId 广告投放计划编号
     * @return 计费金额
     */
    Integer updateSpendPriceWhenPlayComplete(Long planId);

    /**
     * 获取广告投放记录
     */
    PageResult<AppAdPlanVO> getMyPage(Integer pageNo, Integer pageSize, Long userId);

}
